/*
 * entrada.cpp
 *
 *  Created on: 01/07/2014
 *      Author: nicolas
 */

#include "../interfaces/iPersonaPuerta.h"
#include "../ipc/Semaforo.h"
#include "../comun/ParqueRemoto.h"
#include "../ipcRemoto/SemaforoRemoto.h"
#include <stdlib.h>

#include <syslog.h>
#include <stdio.h>

int main(int argc, char **argv) {

	/*
		 * Repetir:
		 *
			 * Recibir mensaje de persona que quiere entrar
			 *
			 * tomar shmem parque
			 *
			 * ver cant de personas, si hay lugar, incrementar el contador
			 *
			 * liberar shmem
			 *
			 * enviar mensaje a persona si puede entrar o no
		 *
		 */


	if (argc < 2) {
		// TODO informar que se debe ingresar numero de puerta
		return 1;
	}

	int numPuerta = atoi(argv[1]);

	char encabezado[80];
	sprintf(encabezado, "PuertaEntrada %i", numPuerta);
	openlog(encabezado, LOG_PID | LOG_CONS, LOG_LOCAL0);

	iPersonaPuerta ipersona(numPuerta);
	ipersona.tipo(Tipos::PUERTA_ENTRADA);

	//Parque parque;
	ParqueRemoto parque(ipersona.idPuerta(), ipersona.idBroker());

	//iSemaforo *mtxParque = new Semaforo(RUTA, 1, ID_MUTEX_PARQUE);
	iSemaforo *mtxParque = new SemaforoRemoto(ID_MUTEX_PARQUE,ipersona.idPuerta(), ipersona.idBroker());


	int idPersona;



	while (true) {

		idPersona = ipersona.esperarArrivoDePersona();

		syslog(LOG_INFO, "La persona %i quiere entrar", idPersona);
		int numTicket;


		syslog(LOG_INFO, "TOMANDO MUTEX del PARQUE");
		mtxParque->wait();


		if (parque.parqueAbierto() && parque.hayEspacio()) {
			numTicket = parque.registrarIngreso();
		}
		else {
			numTicket = 0;
		}

		mtxParque->signal();
		syslog(LOG_INFO, "LIBERANDO MUTEX del PARQUE");

		ipersona.respuestaDeIngreso(numTicket, idPersona);
		syslog(LOG_INFO, "Respondio a la persona %i", idPersona);

	}


	delete mtxParque;

	return 0;
}


